package com.upbos.upm.user;

import com.upbos.core.ret.RetCode;
import com.upbos.core.ret.RetData;
import com.upbos.data.core.Pagination;
import com.upbos.upm.cfg.CfgUtil;
import com.upbos.upm.common.PasswordSecureUtil;
import com.upbos.upm.entity.Cfg;
import com.upbos.upm.entity.Role;
import com.upbos.upm.entity.User;
import com.upbos.upm.entity.UserCfg;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

/**
 * <b>Application name：</b> UserService.java <br>
 * <b>Application describing: 用户管理服务类</b> <br>
 * <b>Copyright：</b> Copyright &copy; 2015-2020 yideb.com 版权所有<br>
 * <b>Company：</b> yideb.com <br>
 * <b>Date：</b> 2019年05月11日 17:09 <br>
 * <b>@author：</b> <a href="mailto:wangjz@miyzh.com"> Jason </a>
 * <b>version：</b>V5.0.0
 */
@Service("userService")
public class UserService {

    @Resource
    private UserDao userDao;

    public Pagination listUserByOrgId(Integer pageNo, Integer pageSize, String orgId) {
        return userDao.listUserByOrgId(pageNo, pageSize, orgId);
    }

    public Pagination listUserByDeptId(Integer pageNo, Integer pageSize, String deptId) {
        return userDao.listUserByDeptId(pageNo, pageSize, deptId);
    }

    public Pagination listUserByName(Integer pageNo, Integer pageSize, String orgId, String name) {

        return userDao.listUserByName(pageNo, pageSize, orgId, name);
    }



    /**
     * 获取用户对应的角色列表
     *
     * @param uid 用户Id
     * @return 角色列表
     */
    public List<Role> listUserRole(String uid) {
        return userDao.listUserRole(uid);
    }

    /**
     * 获取系统全部的角色列表
     *
     * @return 角色列表
     */
    public List<Role> listRole(String orgId) {
        return userDao.listRole(orgId);
    }

    /**
     * 新增用户以及对应的角色
     *
     * @param user  用户信息
     * @param roles 角色
     * @return 用户id
     * @throws Exception
     */
    @Transactional(rollbackFor = Exception.class)
    public RetData insertUser(User user, String roles) throws Exception {
        RetData retData = new RetData(RetCode.SUCCESS);
        //密码加密处理
        user.setPassword(PasswordSecureUtil.encrypt(user.getPassword()));
        user = userDao.insertUser(user);
        userDao.insertUserRole(user.getUid(), roles);
        retData.setData(user);
        return retData;
    }

    /**
     * 更新用户信息以及对应的角色
     *
     * @param user  用户信息
     * @param roles 角色列表
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public void updateUser(User user, String roles) {
        userDao.updateUser(user);
        // 先删除用户对应的角色，再插入角色
        userDao.deleteUserRole(user.getUid());
        userDao.insertUserRole(user.getUid(), roles);
    }

    /**
     * 删除用户
     *
     * @param uid 用户Id
     */
    @Transactional(rollbackFor = Exception.class)
    public void deleteUser(String uid) {
        // 删除用户角色
        userDao.deleteUserRole(uid);
        // 删除用户
        userDao.deleteUser(uid);
    }

    /**
     * 重置密码
     *
     * @param uid      用户Id
     * @param password 密码
     * @throws Exception
     */
    @Transactional(rollbackFor = Exception.class)
    public void resetPassword(String uid, String password) throws Exception {
        User user = new User();
        user.setUid(uid);
        //密码加密处理
        user.setPassword(PasswordSecureUtil.encrypt(password));
        userDao.resetPassword(user);
    }

    /**
     * 修改密码，并验证旧密码是否正确
     *
     * @param uid         用户ID
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return 是否成功，false表示旧密码不正确，true表示成功
     */
    public boolean modifyPassword(String uid, String oldPassword, String newPassword) throws Exception {
        // 根据用户ID查询用户信息
        User user = userDao.getUserByUid(uid);
        String oldP = PasswordSecureUtil.encrypt(oldPassword);
        if (!oldP.equals(user.getPassword())) {
            return false;
        }

        // 修改密码
        user.setPassword(PasswordSecureUtil.encrypt(newPassword));
        userDao.updatePassword(user);

        return true;
    }

    /**
     * 检查登录帐号是否唯一
     *
     * @param loginName
     * @return 账号是否唯一
     */
    public boolean existLoginName(String loginName) {
        return userDao.existLoginName(loginName);
    }


    public List<UserCfg> listUserCfg(String uid, String... keys) {
        List<UserCfg> userCfgs = userDao.listUserCfg(uid, keys);
        List<Cfg> cfgs = CfgUtil.listCfg(keys);

        for (Cfg cfg : cfgs) {
            UserCfg userCfg = new UserCfg();
            BeanUtils.copyProperties(cfg, userCfg);
            if (!userCfgs.contains(userCfg)) {
                userCfgs.add(userCfg);
            }
        }

        return userCfgs;
    }

    public UserCfg getUserCfg(String uid, String key) {
        UserCfg userCfg = userDao.getUserCfg(uid, key);
        Cfg cfg = CfgUtil.getCfg(key);
        if (userCfg == null && cfg != null) {
            userCfg = new UserCfg();
            userCfg.setKey(cfg.getKey());
            userCfg.setValue(cfg.getValue());
        }
        return userCfg;
    }
}
